WM_MOUSELEAVE

Otázka od: Sula Milos

10. 10. 2002 9:16

Nevite nekdo zda se daji messages pro VCL komponenty zachytavat i primo
v projektu bez toho aniz bych dopisoval obsluzny event primo do te
komponenty ? Napriklad mam na formu komponentu TImage a chci v aplikaci
odchytit zpravu WM_MOUSELEAVE, ktera neni standartne obsluhovana
komponentou (samozrejme po aktivaci pomoci trackmouseevent API funkci).

Milos

Odpovedá: Blazek Jaroslav

10. 10. 2002 20:05

Ahoj,

> milos.sula@oku-su.cz 10.10.02 9:15 >>>
>Nevite nekdo zda se daji messages pro VCL komponenty zachytavat i primo
>v projektu bez toho aniz bych dopisoval obsluzny event primo do te
>komponenty ? Napriklad mam na formu komponentu TImage a chci v aplikaci
>odchytit zpravu WM_MOUSELEAVE, ktera neni standartne obsluhovana
>komponentou (samozrejme po aktivaci pomoci trackmouseevent API funkci).

no nevim.....ale pro TImage asi WM_MOUSELEAVE neudelas, protoze to neni okno
(nema Handle:HWND)
pokud bude na nejakem Panelu (TImage - alClient), tak potom se necha
WM_MOUSELEAVE udelat na ten Panel

zkusil jsem si jen takovu zbesilost na jeden Panel, ale samozrejme je lepsi to
udelat v potomku po TCustomPanel

    procedure FormCreate(Sender: TObject);
  private
    FTME:TTRACKMOUSEEVENT;
    procedure NewPanelWndProc(var AMsg:TMessage);

var
  Form1: TForm1;
  OldPanelWndProc:TWndMethod;

procedure TForm1.FormCreate(Sender: TObject);
begin
 FTME.cbSize := sizeof(TTRACKMOUSEEVENT);
 FTME.dwFlags := TME_LEAVE;
 FTME.dwHoverTime := HOVER_DEFAULT;
 FTME.hwndTrack := Panel1.Handle;
 if not TrackMouseEvent(FTME) then
  ShowMessage('Chyba');

 OldPanelWndProc := Panel1.WindowProc;
 Panel1.WindowProc := NewPanelWndProc;
end;

procedure TForm1.NewPanelWndProc(var AMsg:TMessage);
const TrackLeave:boolean = false;
const TrackHover:boolean = true;
begin
 case AMsg.Msg of
  WM_MOUSEMOVE :
                 begin
                  if not TrackLeave then
                  begin
                   TrackLeave := true;
                   FTME.cbSize := sizeof(TTRACKMOUSEEVENT);
                   FTME.dwFlags := TME_LEAVE;
                   FTME.dwHoverTime := HOVER_DEFAULT;
                   FTME.hwndTrack := Panel1.Handle;
                   if not TrackMouseEvent(FTME) then
                    ShowMessage('Chyba');
                  end;
                  if TrackHover then
                  begin
                   Panel1.Cursor := crHandPoint;
                   TrackHover := false;
                  end;
                 end;
  WM_MOUSELEAVE :
                  begin
                   Panel1.Cursor := crDefault;
                   TrackLeave := false;
                   TrackHover := true;
                  end;
 end;
 OldPanelWndProc(AMsg);
end;


S pozdravem

Bc. Jaroslav Blazek
Access-IT Ceska Lipa
mailto:jaroslav.blazek@access-it.cz
http://www.access-it.cz
ICQ# : 133673990
+420605/813644

Odpovedá: Petr Vones

12. 10. 2002 20:10

From: "Sula Milos" <milos.sula@oku-su.cz>
> Nevite nekdo zda se daji messages pro VCL komponenty zachytavat i primo
> v projektu bez toho aniz bych dopisoval obsluzny event primo do te
> komponenty ?

Pokud je formular parentem te komponety (tedy dana komponenta neni umistena
napriklad na TPanelu) tak muzes zpravy CM_MOUSELEAVE/ENTER odchytavat primo ve
formulari, LParam obsahuje instanci komponenty. Napriklad pro TButton:

  TForm1 = class(TForm)
    Button1: TButton;
  private
  protected
    procedure CMMouseEnter(var Message: TMessage); message CM_MOUSEENTER;
    procedure CMMouseLeave(var Message: TMessage); message CM_MOUSELEAVE;
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.DFM}

{ TForm1 }

procedure TForm1.CMMouseEnter(var Message: TMessage);
begin
  if TComponent(Message.LParam) = Button1 then
    Button1.Font.Style := [fsBold];
end;

procedure TForm1.CMMouseLeave(var Message: TMessage);
begin
  if TComponent(Message.LParam) = Button1 then
    Button1.Font.Style := [];
end;

Petr Vones